题目描述

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

分析

其实该题就是考察一个进栈序列能否和一个出栈序列对应起来,但是棘手的地方在于:一个进栈序列可能会有多个出栈的顺序,所以还是得好好想一想。


可以从一个简单的例子开始:

序列A:1,2,3

序列B:2,3,1

1先进栈,B序列中未出栈的第一个数字是2,说明此时1不能再接着出栈;

2再进栈,B序列中未出栈 的第一个数字是2,说明第一个出栈的数字是2,那么2就此出栈;

此时栈顶元素为1,B序列中未出栈的第一个数字是1,说明1是自2出栈后的再一个出栈元素,那么1就此出栈,此时栈为空;

3继续进栈,此时B序列的中未出栈的第一个数字是3,说明3是再一个出栈元素,那么3就此出栈,此时栈为空,序列A也全都进栈完毕了;

栈空了,序列A也进栈完毕了,说明B就是A的弹出序列。

代码实现

接着这个思路,可以试着写代码了

function IsPopOrder(pushV, popV)
{
    if(pushV.length === 0 || popV.length === 0 || pushV.length !== popV.length)
        return false;
    // 进栈序列和出栈序列分别有一个指针,从头开始
    var curPushIndex = 0, curPopIndex = 0;
    var stack = [];
    
    for(;curPushIndex < pushV.length;curPushIndex++) {
        
        stack.push(pushV[curPushIndex]);
        while(curPopIndex < popV.length && stack[stack.length-1] === popV[curPopIndex]){
        // 栈顶元素和当前popIndex指向的数字一样的话,stack弹出栈顶元素,且当前popIndex指向pop序列的下一个数字
            stack.pop();
            curPopIndex++;
        }
    }
    // 栈中元素没有全部弹出,说明两个序列并不匹配,否则,就是匹配
    return stack.length === 0;
}

耳东
766 声望51 粉丝

知乎专栏:[链接]